﻿using System;
using System.ServiceModel;
using System.Security.Permissions;
using Sinacor.Infra.Service.Security.Services;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using System.Collections.Generic;

namespace Sinacor.Servico.Bovespa.Corretagem.Service.ServiceContract
{
    //Task  : 5617 
    // Data : 13/03/2009
    // Autor:Apsilva
    /// <summary>
    /// Contrato de servico IDesconto
    /// </summary>
    [ExceptionShielding]
    [ServiceContract(Namespace = "http://www.bovespa.com.br/Sinacor.ServicoCorretagem.Service.ServiceContract", Name = "IDesconto", SessionMode = SessionMode.Allowed)]

    public interface IDesconto
    {
        /// <summary>
        /// Serviço irá Consultar uma lista de Descontos, utilizando o parâmetro informado.
        //  Transacional: Não
        /// </summary>
        /// <param name="request"></param>
        [OperationLog]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "ConsultarDescontos")]
        List<DataContract.Response.DescontoResponse> ConsultarDescontos(DataContract.Request.FiltroDescontoChaveRequest request);


        /// <summary>
        /// Serviço irá Excluir o Desconto informado como parâmetro.
        /// Transacional: Nao
        /// </summary>
        /// <param name="request"></param>
        [OperationLog]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "ExcluirDesconto")]
        void ExcluirDesconto(DataContract.Request.FiltroDescontoChaveRequest request);

        /// <summary>
        ///  Serviço irá Excluir uma coleção de Descontos informados como parâmetro.
        ///  Transacional: Sim
        /// </summary>
        /// <param name="request"></param>
        [OperationLog]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [TransactionRequired]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "ExcluirDescontos")]
        void ExcluirDescontos(List<DataContract.Request.FiltroDescontoChaveRequest> request);

        /// <summary>
        /// Serviço irá excluir/incluir/alterar os objetos Desconto informados como parâmetro.
        /// Transacional: Sim
        /// </summary>
        /// <param name="inclusaoList"></param>
        /// <param name="exclusaoList"></param>
        /// <param name="alteracaoList"></param>
        [OperationLog]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [TransactionRequired]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "ExecutarTransacoesDesconto")]
        void ExecutarTransacoesDesconto(List<DataContract.Request.DescontoRequest> inclusaoList, List<DataContract.Request.FiltroDescontoChaveRequest> exclusaoList);
        
        /// <summary>
        /// Serviço irá Incluir o Desconto informado como parâmetro e ajustar o desconto em conflito.
        /// Transacional: Sim
        /// </summary>
        /// <param name="request"></param>
        [OperationLog]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [TransactionRequired]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "IncluirAjustarDesconto")]
        void IncluirAjustarDesconto(DataContract.Request.DescontoRequest request);

        /// <summary>
        /// Serviço irá Incluir o Desconto informado como parâmetro.
        /// Transacional: Nao
        /// </summary>
        /// <param name="request"></param>
        [OperationLog]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]

        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "IncluirDesconto")]
        void IncluirDesconto(DataContract.Request.DescontoRequest request);

        /// <summary>
        /// Serviço irá Incluir uma coleção de Descontos informados como parâmetro.
        /// Transacional: Sim
        /// </summary>
        /// <param name="requestList"></param>
        [OperationLog]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [TransactionRequired]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "IncluirDescontos")]
        void IncluirDescontos(List<DataContract.Request.DescontoRequest> requestList);

        /// <summary>
        ///  Serviço irá Obter o Desconto informado como parâmetro
        ///  Transacional: Não
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [OperationLog]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]

        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "ObterDesconto")]
        DataContract.Response.DescontoResponse ObterDesconto(DataContract.Request.FiltroDescontoRequest request);

        /// <summary>
        /// Serviço irá verificar se o período do Desconto informado como parâmetro conflita com outro período de Desconto já cadastrado.
        /// Transacional: Nao
        /// </summary>
        /// <returns></returns>
        [OperationLog]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]

        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "VerificarConflitoPeriodo")]
        DataContract.Response.ConflitoResponse VerificarConflitoPeriodo(DataContract.Request.DescontoRequest request);

    }
}
